Assignment 1

1.1

Word cloud for OneTwo.txt

rr # word cloud for OneTwo.txt df1\(doc_id=1:nrow(df1) colnames(df1)[1]<-\text\ #Here we interpret each line in the document as separate document mycorpus <- Corpus(DataframeSource(df1)) #Creating corpus (collection of text data) mycorpus <- tm_map(mycorpus, removePunctuation) mycorpus <- tm_map(mycorpus, function(x) removeWords(x, stopwords(\english\))) tdm <- TermDocumentMatrix(mycorpus) #Creating term-document matrix m <- as.matrix(tdm) #here we merge all rows v <- sort(rowSums(m),decreasing=TRUE) #Sum up the frequencies of each word d <- data.frame(word = names(v),freq=v) #Create one column=names, second=frequences pal <- brewer.pal(8,\Dark2\) pal <- pal[-(1:2)] #Create palette of colors wordcloud(d\)word,d$freq, scale=c(8,.3),min.freq=2,max.words=100, random.order=F, rot.per=.15, colors=pal, vfont=c(serif,))

Word cloud for Five.txt

rr # wordcloud for Five.txt df2\(doc_id=1:nrow(df2) colnames(df2)[1]<-\text\ #Here we interpret each line in the document as separate document mycorpus <- Corpus(DataframeSource(df2)) #Creating corpus (collection of text data) mycorpus <- tm_map(mycorpus, removePunctuation) mycorpus <- tm_map(mycorpus, function(x) removeWords(x, stopwords(\english\))) tdm <- TermDocumentMatrix(mycorpus) #Creating term-document matrix m <- as.matrix(tdm) #here we merge all rows v <- sort(rowSums(m),decreasing=TRUE) #Sum up the frequencies of each word d <- data.frame(word = names(v),freq=v) #Create one column=names, second=frequences pal <- brewer.pal(5,\Dark2\) pal <- pal[-(1:2)] #Create palette of colors wordcloud(d\)word,d$freq, scale=c(8,.3),min.freq=2,max.words=100, random.order=F, rot.per=.15, colors=pal, vfont=c(serif,))

1.2

Phrase nets for Five.Txt and OneTwo.Txt with connector words

Phrase net for Five.txt

Phrase net for Five.txt

Phrase net for OneTwo.txt

Phrase net for OneTwo.txt

1.3

Word Trees

Assignment 2

# Olive data
olive <- read.csv("olive.csv", sep = ",", header = TRUE)
olive_shared <- SharedData$new(olive)

2.1

eic_lin_scatt <- olive_shared %>% 
  plot_ly(x = ~linoleic, y =~ eicosenoic) #%>%
  #add_markers(list(size = 6, color = "orange"))

We found, for unusually low observations of Eicosenoic it takes the values of 1,2,and 3.

2.2

bar_chart <- olive_shared %>%
  plot_ly( x =~ Region) %>%
  add_histogram() %>%
  layout(barmode = "overlay")
bar_chart
bscols(widths=c(2, NA),filter_slider("S", "Stearic", olive_shared, ~stearic)
        ,subplot(eic_lin_scatt, bar_chart)%>%
  highlight(on="plotly_select", dynamic=T, persistent = T, opacityDim = I(1))%>%hide_legend())
No trace type specified:
  Based on info supplied, a 'scatter' trace seems appropriate.
  Read more about this trace type -> https://plot.ly/r/reference/#scatter
No scatter mode specifed:
  Setting the mode to markers
  Read more about this attribute -> https://plot.ly/r/reference/#scatter-mode
Adding more colors to the selection color palette.
We recommend setting `persistent` to `FALSE` (the default) because persistent selection mode can now be used by holding the shift key (while triggering the `on` event).
Setting the `off` event (i.e., 'plotly_relayout') to match the `on` event (i.e., 'plotly_selected'). You can change this default via the `highlight()` function.
Setting the `off` event (i.e., 'plotly_relayout') to match the `on` event (i.e., 'plotly_selected'). You can change this default via the `highlight()` function.

1.3

ara_lin_scatt <- olive_shared %>% 
  plot_ly(x = ~linolenic, y =~ arachidic)
subplot(eic_lin_scatt, ara_lin_scatt) %>%
  highlight(on = "plotly_select", dynamic = T, persistent = T, opacityDim = I(1)) %>%
  hide_legend()
No trace type specified:
  Based on info supplied, a 'scatter' trace seems appropriate.
  Read more about this trace type -> https://plot.ly/r/reference/#scatter
No scatter mode specifed:
  Setting the mode to markers
  Read more about this attribute -> https://plot.ly/r/reference/#scatter-mode
No trace type specified:
  Based on info supplied, a 'scatter' trace seems appropriate.
  Read more about this trace type -> https://plot.ly/r/reference/#scatter
No scatter mode specifed:
  Setting the mode to markers
  Read more about this attribute -> https://plot.ly/r/reference/#scatter-mode
Adding more colors to the selection color palette.
We recommend setting `persistent` to `FALSE` (the default) because persistent selection mode can now be used by holding the shift key (while triggering the `on` event).
Setting the `off` event (i.e., 'plotly_relayout') to match the `on` event (i.e., 'plotly_selected'). You can change this default via the `highlight()` function.
Setting the `off` event (i.e., 'plotly_relayout') to match the `on` event (i.e., 'plotly_selected'). You can change this default via the `highlight()` function.

1.4

parcord <- ggparcoord(olive, columns = c(4:11))
d <- plotly_data(ggplotly(parcord)) %>% group_by(.ID)
d1 <-SharedData$new(d, ~.ID)
plot1 <- plot_ly(d1, x = ~variable, y =~value) %>%
  add_lines(line = list(width = 0.3)) %>%
  add_markers(marker = list(size = 0.3),
              text = ~.ID, hoverinfo = "text")
plot1
#3D-plot and parcoord
df=read.csv("flea.csv")
cannot open file 'flea.csv': No such file or directoryError in file(file, "rt") : cannot open the connection

Appendix

library(ggplot2)
library(plotly)
library(tm)
library(wordcloud)
library(RColorBrewer)
library(crosstalk)
library(GGally)

df1<-read.table("OneTwo.txt",header=F, sep='\n') #Read file
df2<-read.table("Five.txt",header=F, sep='\n')
# word cloud for OneTwo.txt
df1$doc_id=1:nrow(df1)
colnames(df1)[1]<-"text"

#Here we interpret each line in the document as separate document
mycorpus <- Corpus(DataframeSource(df1)) #Creating corpus (collection of text data)
mycorpus <- tm_map(mycorpus, removePunctuation)
mycorpus <- tm_map(mycorpus, function(x) removeWords(x, stopwords("english")))
tdm <- TermDocumentMatrix(mycorpus) #Creating term-document matrix
m <- as.matrix(tdm)

#here we merge all rows
v <- sort(rowSums(m),decreasing=TRUE) #Sum up the frequencies of each word
d <- data.frame(word = names(v),freq=v) #Create one column=names, second=frequences
pal <- brewer.pal(8,"Dark2")
pal <- pal[-(1:2)] #Create palette of colors
wordcloud(d$word,d$freq, scale=c(8,.3),min.freq=2,max.words=100, random.order=F, rot.per=.15, colors=pal, vfont=c("sans serif","plain"))
# wordcloud for Five.txt

df2$doc_id=1:nrow(df2)
colnames(df2)[1]<-"text"

#Here we interpret each line in the document as separate document
mycorpus <- Corpus(DataframeSource(df2)) #Creating corpus (collection of text data)
mycorpus <- tm_map(mycorpus, removePunctuation)
mycorpus <- tm_map(mycorpus, function(x) removeWords(x, stopwords("english")))
tdm <- TermDocumentMatrix(mycorpus) #Creating term-document matrix
m <- as.matrix(tdm)

#here we merge all rows
v <- sort(rowSums(m),decreasing=TRUE) #Sum up the frequencies of each word
d <- data.frame(word = names(v),freq=v) #Create one column=names, second=frequences
pal <- brewer.pal(5,"Dark2")
pal <- pal[-(1:2)] #Create palette of colors
wordcloud(d$word,d$freq, scale=c(8,.3),min.freq=2,max.words=100, random.order=F, rot.per=.15, colors=pal, vfont=c("sans serif","plain"))
# Olive data
olive <- read.csv("olive.csv", sep = ",", header = TRUE)
olive_shared <- SharedData$new(olive)
eic_lin_scatt <- olive_shared %>% 
  plot_ly(x = ~linoleic, y =~ eicosenoic) #%>%
  #add_markers(list(size = 6, color = "orange"))
bar_chart <- olive_shared %>%
  plot_ly( x =~ Region) %>%
  add_histogram() %>%
  layout(barmode = "overlay")

bar_chart
# linking the scatterplot and bar chart
subplot(eic_lin_scatt, bar_chart) %>%
  highlight(on = "plotly_select", dynamic = T, persistent = T, opacityDim = I(1)) %>%
  hide_legend()

bscols(widths=c(2, NA),filter_slider("S", "Stearic", olive_shared, ~stearic)
        ,subplot(eic_lin_scatt, bar_chart)%>%
  highlight(on="plotly_select", dynamic=T, persistent = T, opacityDim = I(1))%>%hide_legend())
ara_lin_scatt <- olive_shared %>% 
  plot_ly(x = ~linolenic, y =~ arachidic)

subplot(eic_lin_scatt, ara_lin_scatt) %>%
  highlight(on = "plotly_select", dynamic = T, persistent = T, opacityDim = I(1)) %>%
  hide_legend()
parcord <- ggparcoord(olive, columns = c(4:11))
d <- plotly_data(ggplotly(parcord)) %>% group_by(.ID)
d1 <-SharedData$new(d, ~.ID, group = "Olive")
plot1 <- plot_ly(d1, x = ~variable, y =~value) %>%
  add_lines(line = list(width = 0.3)) %>%
  add_markers(marker = list(size = 0.3),
              text = ~.ID, hoverinfo = "text")
plot1
#3D-plot and parcoord
df=read.csv("flea.csv")
d2<-SharedData$new(df)

p<-ggparcoord(flea, columns = c(6,7,2))

d<-plotly_data(ggplotly(p))%>%group_by(.ID)
d1<-SharedData$new(d, ~.ID, group="flea")
p1<-plot_ly(d1, x=~variable, y=~value)%>%
  add_lines(line=list(width=0.3))%>%
  add_markers(marker=list(size=0.3),
              text=~.ID, hoverinfo="text")

flea2=flea[, c("tars1", "aede2", "aede3")]
flea2$.ID=1:nrow(flea)
d2<-SharedData$new(flea2, ~.ID, group="flea")

p3<-plot_ly(d2,x=~tars1,y=~aede2,z=~aede3)%>%add_markers()
bscols(p1%>%highlight(on="plotly_select", dynamic=T, persistent = T, opacityDim = I(1))%>%
         hide_legend(),
       p3%>%highlight(on="plotly_click", dynamic=T, persistent = T)%>%hide_legend())

References

LS0tDQp0aXRsZTogIlZpc3VhbGl6YXRpb24gTGFiIDUiDQphdXRob3I6ICJSb3NobmkgU3VuZGFyYW11cnRoeSAocm9zc3U4MDkpICYgQnJpYW4gTWFzaW5kZSAoYnJpbWE3NDgpIg0KZGF0ZTogIjA0IE9jdG9iZXIgMjAxOCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBkZl9wcmludDogcGFnZWQNCiAgaHRtbF9ub3RlYm9vazoNCiAgICB0aGVtZTogam91cm5hbA0KICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQNCmZvbnRzaXplOiAxMXB0DQojYmlibGlvZ3JhcGh5OiByZWZlcmVuY2VzLmJpYg0KLS0tDQoNCmBgYHtyIGxpYnJhcmllcywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRX0NCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkocGxvdGx5KQ0KbGlicmFyeSh0bSkNCmxpYnJhcnkod29yZGNsb3VkKQ0KbGlicmFyeShSQ29sb3JCcmV3ZXIpDQpsaWJyYXJ5KGNyb3NzdGFsaykNCmxpYnJhcnkoR0dhbGx5KQ0KDQpgYGANCg0KIyMgQXNzaWdubWVudCAxDQoNCiMjIyAxLjENCg0KYGBge3IgZWNobz1GQUxTRX0NCmRmMTwtcmVhZC50YWJsZSgiT25lVHdvLnR4dCIsaGVhZGVyPUYsIHNlcD0nXG4nKSAjUmVhZCBmaWxlDQpkZjI8LXJlYWQudGFibGUoIkZpdmUudHh0IixoZWFkZXI9Riwgc2VwPSdcbicpDQpgYGANCg0KV29yZCBjbG91ZCBmb3IgT25lVHdvLnR4dA0KYGBge3J9DQojIHdvcmQgY2xvdWQgZm9yIE9uZVR3by50eHQNCmRmMSRkb2NfaWQ9MTpucm93KGRmMSkNCmNvbG5hbWVzKGRmMSlbMV08LSJ0ZXh0Ig0KDQojSGVyZSB3ZSBpbnRlcnByZXQgZWFjaCBsaW5lIGluIHRoZSBkb2N1bWVudCBhcyBzZXBhcmF0ZSBkb2N1bWVudA0KbXljb3JwdXMgPC0gQ29ycHVzKERhdGFmcmFtZVNvdXJjZShkZjEpKSAjQ3JlYXRpbmcgY29ycHVzIChjb2xsZWN0aW9uIG9mIHRleHQgZGF0YSkNCm15Y29ycHVzIDwtIHRtX21hcChteWNvcnB1cywgcmVtb3ZlUHVuY3R1YXRpb24pDQpteWNvcnB1cyA8LSB0bV9tYXAobXljb3JwdXMsIGZ1bmN0aW9uKHgpIHJlbW92ZVdvcmRzKHgsIHN0b3B3b3JkcygiZW5nbGlzaCIpKSkNCnRkbSA8LSBUZXJtRG9jdW1lbnRNYXRyaXgobXljb3JwdXMpICNDcmVhdGluZyB0ZXJtLWRvY3VtZW50IG1hdHJpeA0KbSA8LSBhcy5tYXRyaXgodGRtKQ0KDQojaGVyZSB3ZSBtZXJnZSBhbGwgcm93cw0KdiA8LSBzb3J0KHJvd1N1bXMobSksZGVjcmVhc2luZz1UUlVFKSAjU3VtIHVwIHRoZSBmcmVxdWVuY2llcyBvZiBlYWNoIHdvcmQNCmQgPC0gZGF0YS5mcmFtZSh3b3JkID0gbmFtZXModiksZnJlcT12KSAjQ3JlYXRlIG9uZSBjb2x1bW49bmFtZXMsIHNlY29uZD1mcmVxdWVuY2VzDQpwYWwgPC0gYnJld2VyLnBhbCg4LCJEYXJrMiIpDQpwYWwgPC0gcGFsWy0oMToyKV0gI0NyZWF0ZSBwYWxldHRlIG9mIGNvbG9ycw0Kd29yZGNsb3VkKGQkd29yZCxkJGZyZXEsIHNjYWxlPWMoOCwuMyksbWluLmZyZXE9MixtYXgud29yZHM9MTAwLCByYW5kb20ub3JkZXI9Riwgcm90LnBlcj0uMTUsIGNvbG9ycz1wYWwsIHZmb250PWMoInNhbnMgc2VyaWYiLCJwbGFpbiIpKQ0KYGBgDQoNCldvcmQgY2xvdWQgZm9yIEZpdmUudHh0DQpgYGB7cn0NCiMgd29yZGNsb3VkIGZvciBGaXZlLnR4dA0KDQpkZjIkZG9jX2lkPTE6bnJvdyhkZjIpDQpjb2xuYW1lcyhkZjIpWzFdPC0idGV4dCINCg0KI0hlcmUgd2UgaW50ZXJwcmV0IGVhY2ggbGluZSBpbiB0aGUgZG9jdW1lbnQgYXMgc2VwYXJhdGUgZG9jdW1lbnQNCm15Y29ycHVzIDwtIENvcnB1cyhEYXRhZnJhbWVTb3VyY2UoZGYyKSkgI0NyZWF0aW5nIGNvcnB1cyAoY29sbGVjdGlvbiBvZiB0ZXh0IGRhdGEpDQpteWNvcnB1cyA8LSB0bV9tYXAobXljb3JwdXMsIHJlbW92ZVB1bmN0dWF0aW9uKQ0KbXljb3JwdXMgPC0gdG1fbWFwKG15Y29ycHVzLCBmdW5jdGlvbih4KSByZW1vdmVXb3Jkcyh4LCBzdG9wd29yZHMoImVuZ2xpc2giKSkpDQp0ZG0gPC0gVGVybURvY3VtZW50TWF0cml4KG15Y29ycHVzKSAjQ3JlYXRpbmcgdGVybS1kb2N1bWVudCBtYXRyaXgNCm0gPC0gYXMubWF0cml4KHRkbSkNCg0KI2hlcmUgd2UgbWVyZ2UgYWxsIHJvd3MNCnYgPC0gc29ydChyb3dTdW1zKG0pLGRlY3JlYXNpbmc9VFJVRSkgI1N1bSB1cCB0aGUgZnJlcXVlbmNpZXMgb2YgZWFjaCB3b3JkDQpkIDwtIGRhdGEuZnJhbWUod29yZCA9IG5hbWVzKHYpLGZyZXE9dikgI0NyZWF0ZSBvbmUgY29sdW1uPW5hbWVzLCBzZWNvbmQ9ZnJlcXVlbmNlcw0KcGFsIDwtIGJyZXdlci5wYWwoNSwiRGFyazIiKQ0KcGFsIDwtIHBhbFstKDE6MildICNDcmVhdGUgcGFsZXR0ZSBvZiBjb2xvcnMNCndvcmRjbG91ZChkJHdvcmQsZCRmcmVxLCBzY2FsZT1jKDgsLjMpLG1pbi5mcmVxPTIsbWF4LndvcmRzPTEwMCwgcmFuZG9tLm9yZGVyPUYsIHJvdC5wZXI9LjE1LCBjb2xvcnM9cGFsLCB2Zm9udD1jKCJzYW5zIHNlcmlmIiwicGxhaW4iKSkNCmBgYA0KDQojIyMgMS4yDQoNClBocmFzZSBuZXRzIGZvciBGaXZlLlR4dCBhbmQgT25lVHdvLlR4dCB3aXRoIGNvbm5lY3RvciB3b3Jkcw0KDQohW1BocmFzZSBuZXQgZm9yIEZpdmUudHh0XShGaXZlLnBuZykNCg0KIVtQaHJhc2UgbmV0IGZvciBPbmVUd28udHh0XShPbmVUd28ucG5nKQ0KDQoNCiMjIyAxLjMNCg0KV29yZCBUcmVlcw0KDQoNCiMjIEFzc2lnbm1lbnQgMg0KDQpgYGB7ciBkYXRhLCBlY2hvID0gVFJVRX0NCiMgT2xpdmUgZGF0YQ0Kb2xpdmUgPC0gcmVhZC5jc3YoIm9saXZlLmNzdiIsIHNlcCA9ICIsIiwgaGVhZGVyID0gVFJVRSkNCmBgYA0KDQpgYGB7ciBzaGFyZWR9DQpvbGl2ZV9zaGFyZWQgPC0gU2hhcmVkRGF0YSRuZXcob2xpdmUpDQpgYGANCg0KDQojIyMgMi4xDQoNCmBgYHtyIHNjYXR0ZXJwbG90LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0NCmVpY19saW5fc2NhdHQgPC0gb2xpdmVfc2hhcmVkICU+JSANCiAgcGxvdF9seSh4ID0gfmxpbm9sZWljLCB5ID1+IGVpY29zZW5vaWMpICMlPiUNCiAgI2FkZF9tYXJrZXJzKGxpc3Qoc2l6ZSA9IDYsIGNvbG9yID0gIm9yYW5nZSIpKQ0KYGBgDQoNCldlIGZvdW5kLCBmb3IgdW51c3VhbGx5IGxvdyBvYnNlcnZhdGlvbnMgb2YgRWljb3Nlbm9pYyBpdCB0YWtlcyB0aGUgdmFsdWVzIG9mIDEsMixhbmQgMy4NCg0KIyMjIDIuMg0KDQpgYGB7ciBiYXJjaGFydH0NCmJhcl9jaGFydCA8LSBvbGl2ZV9zaGFyZWQgJT4lDQogIHBsb3RfbHkoIHggPX4gUmVnaW9uKSAlPiUNCiAgYWRkX2hpc3RvZ3JhbSgpICU+JQ0KICBsYXlvdXQoYmFybW9kZSA9ICJvdmVybGF5IikNCg0KYmFyX2NoYXJ0DQpgYGANCg0KDQpgYGB7ciBsaW5rfQ0KIyBsaW5raW5nIHRoZSBzY2F0dGVycGxvdCBhbmQgYmFyIGNoYXJ0DQpzdWJwbG90KGVpY19saW5fc2NhdHQsIGJhcl9jaGFydCkgJT4lDQogIGhpZ2hsaWdodChvbiA9ICJwbG90bHlfc2VsZWN0IiwgZHluYW1pYyA9IFQsIHBlcnNpc3RlbnQgPSBULCBvcGFjaXR5RGltID0gSSgxKSkgJT4lDQogIGhpZGVfbGVnZW5kKCkNCg0KYnNjb2xzKHdpZHRocz1jKDIsIE5BKSxmaWx0ZXJfc2xpZGVyKCJTIiwgIlN0ZWFyaWMiLCBvbGl2ZV9zaGFyZWQsIH5zdGVhcmljKQ0KICAgICAgICAsc3VicGxvdChlaWNfbGluX3NjYXR0LCBiYXJfY2hhcnQpJT4lDQogIGhpZ2hsaWdodChvbj0icGxvdGx5X3NlbGVjdCIsIGR5bmFtaWM9VCwgcGVyc2lzdGVudCA9IFQsIG9wYWNpdHlEaW0gPSBJKDEpKSU+JWhpZGVfbGVnZW5kKCkpDQpgYGANCg0KIyMjIDEuMw0KDQpgYGB7cn0NCmFyYV9saW5fc2NhdHQgPC0gb2xpdmVfc2hhcmVkICU+JSANCiAgcGxvdF9seSh4ID0gfmxpbm9sZW5pYywgeSA9fiBhcmFjaGlkaWMpDQoNCnN1YnBsb3QoZWljX2xpbl9zY2F0dCwgYXJhX2xpbl9zY2F0dCkgJT4lDQogIGhpZ2hsaWdodChvbiA9ICJwbG90bHlfc2VsZWN0IiwgZHluYW1pYyA9IFQsIHBlcnNpc3RlbnQgPSBULCBvcGFjaXR5RGltID0gSSgxKSkgJT4lDQogIGhpZGVfbGVnZW5kKCkNCmBgYA0KDQojIyMgMS40DQoNCmBgYHtyIHBhcmNvb3JkfQ0KcGFyY29yZCA8LSBnZ3BhcmNvb3JkKG9saXZlLCBjb2x1bW5zID0gYyg0OjExKSkNCmBgYA0KDQpgYGB7cn0NCmQgPC0gcGxvdGx5X2RhdGEoZ2dwbG90bHkocGFyY29yZCkpICU+JSBncm91cF9ieSguSUQpDQpgYGANCg0KYGBge3J9DQpkMSA8LVNoYXJlZERhdGEkbmV3KGQsIH4uSUQsIGdyb3VwID0gIk9saXZlIikNCmBgYA0KDQpgYGB7cn0NCnBsb3QxIDwtIHBsb3RfbHkoZDEsIHggPSB+dmFyaWFibGUsIHkgPX52YWx1ZSkgJT4lDQogIGFkZF9saW5lcyhsaW5lID0gbGlzdCh3aWR0aCA9IDAuMykpICU+JQ0KICBhZGRfbWFya2VycyhtYXJrZXIgPSBsaXN0KHNpemUgPSAwLjMpLA0KICAgICAgICAgICAgICB0ZXh0ID0gfi5JRCwgaG92ZXJpbmZvID0gInRleHQiKQ0KcGxvdDENCmBgYA0KDQpgYGB7cn0NCiMzRC1wbG90IGFuZCBwYXJjb29yZA0KZGY9cmVhZC5jc3YoImZsZWEuY3N2IikNCmQyPC1TaGFyZWREYXRhJG5ldyhkZikNCg0KcDwtZ2dwYXJjb29yZChmbGVhLCBjb2x1bW5zID0gYyg2LDcsMikpDQoNCmQ8LXBsb3RseV9kYXRhKGdncGxvdGx5KHApKSU+JWdyb3VwX2J5KC5JRCkNCmQxPC1TaGFyZWREYXRhJG5ldyhkLCB+LklELCBncm91cD0iZmxlYSIpDQpwMTwtcGxvdF9seShkMSwgeD1+dmFyaWFibGUsIHk9fnZhbHVlKSU+JQ0KICBhZGRfbGluZXMobGluZT1saXN0KHdpZHRoPTAuMykpJT4lDQogIGFkZF9tYXJrZXJzKG1hcmtlcj1saXN0KHNpemU9MC4zKSwNCiAgICAgICAgICAgICAgdGV4dD1+LklELCBob3ZlcmluZm89InRleHQiKQ0KDQpmbGVhMj1mbGVhWywgYygidGFyczEiLCAiYWVkZTIiLCAiYWVkZTMiKV0NCmZsZWEyJC5JRD0xOm5yb3coZmxlYSkNCmQyPC1TaGFyZWREYXRhJG5ldyhmbGVhMiwgfi5JRCwgZ3JvdXA9ImZsZWEiKQ0KDQpwMzwtcGxvdF9seShkMix4PX50YXJzMSx5PX5hZWRlMix6PX5hZWRlMyklPiVhZGRfbWFya2VycygpDQpic2NvbHMocDElPiVoaWdobGlnaHQob249InBsb3RseV9zZWxlY3QiLCBkeW5hbWljPVQsIHBlcnNpc3RlbnQgPSBULCBvcGFjaXR5RGltID0gSSgxKSklPiUNCiAgICAgICAgIGhpZGVfbGVnZW5kKCksDQogICAgICAgcDMlPiVoaWdobGlnaHQob249InBsb3RseV9jbGljayIsIGR5bmFtaWM9VCwgcGVyc2lzdGVudCA9IFQpJT4laGlkZV9sZWdlbmQoKSkNCmBgYA0KDQojIyMgQXBwZW5kaXgNCg0KYGBge3IgcmVmLmxhYmVsPWtuaXRyOjphbGxfbGFiZWxzKCksIGVjaG8gPSBULCBldmFsID0gRn0NCg0KYGBgDQoNCiMjIyBSZWZlcmVuY2Vz